這篇文章可能不是很多人會用到,但是如果開發系統是 Mac M1 的話,可能會遇到一些問題,所以還是寫了這篇文章來介紹一下。
Docker Buildx 是一個 Docker 的 plugin,可以用來建立 Image,並且可以建立多個平台的 Image,例如:Linux、Windows、Mac。其中 Mac 是分成兩種,一種是 x86_64,另一種是 arm64。所以如果是 Mac M1 或是 M2,又或者是 Windows 用 ARM CPU 的話,就可以使用 Docker Buildx 來建立 Image,以便讓你的 Image 可以有更好的相容性。
如果不確定自己的 docker 是什麼架構的話,可以在 Terminal 執行以下指令:
$ docker version
會看到類似以下的結果,可以去做區分:
在 Terminal 執行以下指令,新增一個名為 buildx
的 builder。
$ docker buildx create --name buildx
然後執行以下指令,選擇這個 builder。
$ docker buildx use buildx
並看一下目前的 builder 有哪些架構可以使用。
$ docker buildx inspect --bootstrap
會看到類似以下的結果:
在建立 Image 之前,要先確定自己的 Docker Hub 帳號有沒有在 Docker Desktop 裡面登入,如果沒有的話,可以在 Terminal 執行以下指令:
$ docker login
沒有帳號的話記得去辦一下,接下來就可以開始建立 Image 了。
$ docker buildx build --platform linux/amd64,linux/arm64 -t <username>/<image-name>:<tag> --push .
但是可能會遇到以下的錯誤:
所以修正一下 Dockerfile:
# 使用 Ubuntu 作為基底來編譯程式
FROM ubuntu:latest as builder
# 設置非交互式環境變數以避免安裝時的提示
ENV DEBIAN_FRONTEND=noninteractive
# 安裝 Rust 和其他必要的依賴項
RUN apt-get update && \
apt-get install -y curl build-essential && \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
# 複製程式碼到容器中
WORKDIR /usr/src/qrcode-actix
COPY . .
# 使用 --release 建構程式
RUN /root/.cargo/bin/cargo build --release
# 使用一個輕量級的 image 來執行程式
FROM ubuntu:latest
# 設置非交互式環境變數以避免安裝時的提示
ENV DEBIAN_FRONTEND=noninteractive
# 安裝必要的共享庫
RUN apt-get update && apt-get install -y \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# 複製二進位檔到容器中
COPY --from=builder /usr/src/qrcode-actix/target/release/qrcode-actix /usr/local/bin/qrcode-actix
# 指定容器執行程式
CMD ["qrcode-actix"]
再重新打包一次並 push 到 Docker Hub 應該就沒問題,可以在 Docker Hub 上看到 Image 已經建立完成了。